package com.cloud.springcloudribbon.consumer;

import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.HystrixRequestCache;
import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy;
import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategyDefault;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import rx.Observable;
import rx.Observer;

import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;

/**
 * weiximei on 2018/5/1
 */
@RestController
public class ConsumerController {

    /**  这里注释掉，因为没有实现高可用！  **/

    /**
     * 引入 Ribbon组件 进行客户端的负载均衡的类
     */
//    @Autowired
//    private LoadBalancerClient loadBalancerClient;
//
//    @RequestMapping("/consumer")
//    public String hellorConsumer(){
//        // stores.ribbon.listOfServers=localhost:8082,localhost:8081
//        // 这里的值是我们自定义 stores，但是上面的ribbon.listOfServers是定死的
//        // 经过 LoadBalancerClient 的均衡算法（默认轮询算法），会给出集群中的一个客户端的URI，
//        ServiceInstance serviceInstance = loadBalancerClient.choose("stores");
//        // http://%s:%s 是一个语法，$s会被替成相应的内容
//        URI url = URI.create(String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort()));
//
//        return url.toString();
//    }


    /** Ribbon和Eureka注册中心对接后，实现高可用的获取服务列表的地址 **/


    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/consumer")
    public String ribbonConsumer(){
        // 获取这个服务，并把结果返回出去
        // 请求 HELLO-SERVICE 服务中心，然后就会获取到 HELLO-SERVICE 服务上注册好的客户端列表,
        // 然后根据这个列表进行均很负载算法得到一个Eureka客户端的连接
        return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody();
    }




}
